#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
using namespace std;

// int main()
//{
//	const char* s1 = "Hello,world!";
//	cout << s1 << endl;
//	return 0;
// }

//____________________________________insert erase讲解

// int main()
//{
//	//string s1("hello world");
//	//s1.insert(5, "xxxx");
//	//cout << s1 << endl;
//
//	////s1.insert(0, 1, 'x');
//	//s1.insert(s1.begin(), 'y');
//	//cout << s1 << endl;
//
//	string s1("hello world");
//	s1.insert(5, "xxxx");
//	cout << s1 << endl;
//
//	s1.insert(0, 1, 'x');
//	s1.insert(s1.begin(), 'y');
//	cout << s1 << endl;
//
//	s1.erase(5, 4);
//	cout << s1 << endl;
//
//	s1.erase(5);
//	cout << s1 << endl;
//
//	return 0;
// }

// int main()
//{
//	//string s1("hello world");
//	//s1.insert(5, "xxxx");
//	//cout << s1 << endl;
//
//	////s1.insert(0, 1, 'x');
//	//s1.insert(s1.begin(), 'y');
//	//cout << s1 << endl;
//
//	string s1("hello world");
//	s1.insert(5, "xxxx");
//	cout << s1 << endl;
//
//	s1.insert(0, 1, 'x');
//	s1.insert(s1.begin(), 'y');
//	cout << s1 << endl;
//
//	s1.erase(5, 4);
//	cout << s1 << endl;
//
//	s1.erase(5);
//	cout << s1 << endl;
//
//	return 0;
// }

//___________________________assign replace find  讲解.
// 题目：把所有的空格替换为20%
// int main()
//{
//	//------使用 find 和 replace 函数替换空格
//	string s1("hello  world  hah a");
//	cout << s1 << endl;
//	//4. replace (第一条最实用)
//	//
//	size_t pos = s1.find(' ',0);
//	while (pos !=string::npos )
//	{
//		s1.replace(pos, 1, "20%");
//		//replace的效率其实很低的，能不用就不用。
//		pos = s1.find(' ',pos+3);//因为替换一个20%后，直接从20%的后面找，也是就pos+3
//	}
//	cout << s1 << endl;
//
//
//	//简单写法-使用循环遍历字符串并替换空格
//	string s2("hello  world  hah a");
//	cout << s1 << endl;
//	string s3;
//	for (auto ch : s2)
//	{
//		if (ch == ' ')
//		{
//			s3 += "%20";
//		}
//		else
//		{
//			s3 +=ch;
//		}
//
//	}
//	cout << s3 << endl;
//	s2.swap(s3);  //swap讲解	 .png板书上
//	return 0;
//}

// ________________________ c_str 返回C形式字符串。   是C++为了兼容C语言
// string 不能传给 const char *(fopen的 第一个参数 )

// int main()
//{
//	string filename("test1.cpp");
//	//FILE* fout = fopen(filename, "r");
//	FILE* fout = fopen(filename.c_str(), "r");
//	char ch = fgetc(fout);
//	while (ch != EOF)
//	{
//		cout << ch;
//		ch = fgetc(fout);
//	}
//	return 0;
// }

// data和c_str比较像
// copy   搞起谁拷贝给谁  其实很少用

//_________________________________________________find  substr   rfind
// 题目: 1.要求把 一个文件 test.txt   后缀取出来
//
// int main()
//{
//	string s1("Test.cpp");
//	string s2("Test.tar.zip");
//	size_t pos1 = s1.rfind('.');
//	if (pos1 != string::npos)
//	{
//		string suff = s1.substr(pos1);
//		cout << suff << endl;
//	}
//
//	size_t pos2 = s2.rfind('.');
//	if (pos2 != string::npos)
//	{
//		string suff = s2.substr(pos2);
//		cout << suff << endl;
//	}
//	return 0;
//}

// 2.把一个网站的网址 三个部分分离出来.
// https
// legacy.cplusplus.com
// reference / string / string / substr /
// int main()
//{
//	string str("https://legacy.cplusplus.com/reference/string/string/substr/");
//	string sub1, sub2, sub3;
//	size_t pos1 = str.find(':');//:在从0开始，第五个位置
//	sub1 = str.substr(0, pos1 - 0);//pos-1 刚好是五个。
//	cout << sub1 << endl;
//
//	size_t pos2 = str.find('/', pos1 + 3);//从l开始
//	sub2 = str.substr(pos1 + 3, pos2 - (pos1 + 3));//这里要弄清楚具体的位置
//	cout << sub2 << endl;
//
//	sub3 = str.substr(pos2 + 1);//从r 一直截取到末尾
//	cout << sub3 << endl;
//	return 0;
// }

// find _first_of    aeiou   里面 找i
// 还有拿几个 first_not_of
//+

// int main()
//{
//	string str("Please, replace the vowels in this sentence by asterisks.");
//	size_t pos = str.find_first_of("abc");
//	while (pos != string::npos)
//	{
//		str[pos] = '*';
//		pos = str.find_first_of("abc",pos+1);
//	}
//	cout << str << endl;
//	//			Ple*se, repl**e the vowels in this senten*e *y *sterisks.
// }

// #include <iostream>
// using namespace std;
// int main() {
//     string str;
//     cin>>str;
//     //getline(cin, str);
//     size_t pos = str.rfind(' ');
//     if (pos != string::npos)
//     {
//         cout << str.size() - pos - 1 << endl;//注意这里的位置
//     }
//     else {//找不到的时候(只有一串没有空格的字符串)
//         cout << str.size() << endl;
//     }
// }
// cin 和scanf默认用换行和空格进行分割

// 题
// 如果输入的字符串里有空格，比如输入 ABCT D  直接输进去可能被当场两个字符串 ABCT 和D 用getline

// 模拟实现
// const char* 初始化char* 会 权限放大 不行
// str()  里面  多开辟一个空间是因为/0
// capacity 不加1更好
// free 和delete 如果给空指针，那就什么都不做
//  []   要引用返回 才能修改。  减少拷贝，修改返回值

// 范围for是傻瓜式的替换迭代器

#include "string1.h"
int main()
{
    bit::test_string1();

    return 0;
}